package br.com.vestibulation.backbean;

import br.com.vestibulation.bean.Opcao;
import br.com.vestibulation.bean.Questao;
import br.com.vestibulation.dao.QuestaoDAO;
import java.util.ArrayList;
import javax.faces.application.FacesMessage;
import javax.faces.bean.*;
import javax.faces.context.FacesContext;

@ManagedBean(name="questaoBackBean")
@SessionScoped
public class QuestaoBackBean {
    private ArrayList<Questao> listaQuestoes;
    private Questao questao;
    private int opcaoCerta;
    private Opcao opcao1, opcao2, opcao3, opcao4, opcao5;

    public QuestaoBackBean(){
        QuestaoDAO dao = new QuestaoDAO();
        listaQuestoes = dao.listarQuestoes();
        questao = new Questao();
        questao.setListaOpcoes(new ArrayList<Opcao>());
        opcao1 = new Opcao();
        opcao2 = new Opcao();
        opcao3 = new Opcao();
        opcao4 = new Opcao();
        opcao5 = new Opcao();
    }

    public ArrayList<Questao> getListaQuestoes() {
        return listaQuestoes;
    }

    public void setListaQuestoes(ArrayList<Questao> listaQuestoes) {
        this.listaQuestoes = listaQuestoes;
    }

    public Opcao getOpcao1() {
        return opcao1;
    }

    public void setOpcao1(Opcao opcao1) {
        this.opcao1 = opcao1;
    }

    public Opcao getOpcao2() {
        return opcao2;
    }

    public void setOpcao2(Opcao opcao2) {
        this.opcao2 = opcao2;
    }

    public Opcao getOpcao3() {
        return opcao3;
    }

    public void setOpcao3(Opcao opcao3) {
        this.opcao3 = opcao3;
    }

    public Opcao getOpcao4() {
        return opcao4;
    }

    public void setOpcao4(Opcao opcao4) {
        this.opcao4 = opcao4;
    }

    public Opcao getOpcao5() {
        return opcao5;
    }

    public void setOpcao5(Opcao opcao5) {
        this.opcao5 = opcao5;
    }

    public Questao getQuestao() {
        return questao;
    }

    public void setQuestao(Questao questao) {
        this.questao = questao;
    }

    public String editar(Questao questao){
        this.questao = questao;
        return "Editar";
    }

    public int numeroOpcao(Opcao opcao){
        return questao.getListaOpcoes().indexOf(opcao)+1;
    }

    public int getOpcaoCerta() {
        for(int i=0;i<questao.getListaOpcoes().size();i++){
            if(questao.getListaOpcoes().get(i).isCerta()){
                opcaoCerta = i+1;
            }
        }
        return opcaoCerta;
    }

    public void setOpcaoCerta(int opcaoCerta) {
        this.opcaoCerta = opcaoCerta;
        for(int i=0;i<questao.getListaOpcoes().size();i++){
            if(i==opcaoCerta-1){
                questao.getListaOpcoes().get(i).setCerta(true);
            } else{
                questao.getListaOpcoes().get(i).setCerta(false);
            }
        }
    }

    public String alterarQuestao(){
        String retorno = "";
        QuestaoDAO dao = new QuestaoDAO();
        if(dao.editarQuestao(questao)){
            retorno = "Voltar";
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Alteração realizada com sucesso!"));
        } else{
            retorno = null;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao alterar.", "Tente novamente mais tarde."));
        }
        listaQuestoes = dao.listarQuestoes();
        questao = new Questao();
        questao.setListaOpcoes(new ArrayList<Opcao>());
        reiniciarOpcoes();
        return retorno;
    }

    public void adicionarQuestao(){
        QuestaoDAO dao = new QuestaoDAO();
        adicionarOpcoes();
        if(dao.adicionarQuestao(questao)){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Cadastro realizado com sucesso!"));
        } else{
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao cadastrar.", "Tente novamente mais tarde."));
        }
        questao = new Questao();
        questao.setListaOpcoes(new ArrayList<Opcao>());
        listaQuestoes = dao.listarQuestoes();
        reiniciarOpcoes();
    }

    public void adicionarOpcoes(){
        questao.getListaOpcoes().add(opcao1);
        questao.getListaOpcoes().add(opcao2);
        questao.getListaOpcoes().add(opcao3);
        questao.getListaOpcoes().add(opcao4);
        questao.getListaOpcoes().add(opcao5);
        setOpcaoCerta(opcaoCerta);
    }

    public void reiniciarOpcoes(){
        opcao1 = new Opcao();
        opcao2 = new Opcao();
        opcao3 = new Opcao();
        opcao4 = new Opcao();
        opcao5 = new Opcao();
        opcaoCerta = 0;
    }

    public void excluir(Questao questao){
        this.questao = questao;
        QuestaoDAO dao = new QuestaoDAO();
        if(dao.excluirQuestao(questao.getNumero())){
           FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Questão excluída com sucesso!"));
        } else{
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao excluir.", "Tente novamente mais tarde."));
        }
        this.questao = new Questao();
        this.questao.setListaOpcoes(new ArrayList<Opcao>());
        listaQuestoes = dao.listarQuestoes();
        reiniciarOpcoes();
    }

}
